bgo#586315 - gtk_file_chooser_list_shortcut_folders() was crashing
authorFederico Mena Quintero <federico@novell.com>
Fri, 19 Jun 2009 02:29:54 +0000 (21:29 -0500)
committerFederico Mena Quintero <federico@novell.com>
Fri, 19 Jun 2009 02:57:54 +0000 (21:57 -0500)
The virtual method list_shortcut_folders returns a GSList * of GFile *.
In turn, gtk_file_chooser_list_shortcut_folders() converts those to strings.

However, the delegate in gtkfilechooserutils.c was calling
gtk_file_chooser_list_shortcut_folders() every time, so we were trying
to convert invalid data.

Now we have an internal function that deals with GFile *.  That
function is called by the delegate, and the conversion is done only
once by the API entry points.

Signed-off-by: Federico Mena Quintero <federico@novell.com>
gtk/gtkfilechooser.c
gtk/gtkfilechooserprivate.h
gtk/gtkfilechooserutils.c

index a30648a89df7cffe20fdf8fef35d240d3ca2a7b6..f113bea1f05133e59a841ad08f379946882890bc 100644 (file)
@@ -1761,7 +1761,7 @@ gtk_file_chooser_list_shortcut_folders (GtkFileChooser *chooser)
 
   g_return_val_if_fail (GTK_IS_FILE_CHOOSER (chooser), NULL);
 
-  folders = GTK_FILE_CHOOSER_GET_IFACE (chooser)->list_shortcut_folders (chooser);
+  folders = _gtk_file_chooser_list_shortcut_folder_files (chooser);
 
   result = files_to_strings (folders, g_file_get_path);
   g_slist_foreach (folders, (GFunc) g_object_unref, NULL);
@@ -1858,7 +1858,7 @@ gtk_file_chooser_list_shortcut_folder_uris (GtkFileChooser *chooser)
 
   g_return_val_if_fail (GTK_IS_FILE_CHOOSER (chooser), NULL);
 
-  folders = GTK_FILE_CHOOSER_GET_IFACE (chooser)->list_shortcut_folders (chooser);
+  folders = _gtk_file_chooser_list_shortcut_folder_files (chooser);
 
   result = files_to_strings (folders, g_file_get_uri);
   g_slist_foreach (folders, (GFunc) g_object_unref, NULL);
@@ -1867,6 +1867,13 @@ gtk_file_chooser_list_shortcut_folder_uris (GtkFileChooser *chooser)
   return result;
 }
 
+GSList *
+_gtk_file_chooser_list_shortcut_folder_files (GtkFileChooser *chooser)
+{
+  g_return_val_if_fail (GTK_IS_FILE_CHOOSER (chooser), NULL);
+
+  return GTK_FILE_CHOOSER_GET_IFACE (chooser)->list_shortcut_folders (chooser);
+}
 
 /**
  * gtk_file_chooser_set_show_hidden:
index 400a21127082c9940c85763152e6081958d0aba7..be10757c291d6ed927ae793f75343d99918a43dd 100644 (file)
@@ -102,6 +102,7 @@ gboolean       _gtk_file_chooser_add_shortcut_folder     (GtkFileChooser    *cho
 gboolean       _gtk_file_chooser_remove_shortcut_folder  (GtkFileChooser    *chooser,
                                                          GFile             *folder,
                                                          GError           **error);
+GSList *       _gtk_file_chooser_list_shortcut_folder_files (GtkFileChooser *chooser);
 
 /* GtkFileChooserDialog private */
 
index fb0e7b97162cda85ccbe714d9002bc13eefc197f..0eab525b3fa75e7d3c45c3377bd60fa1aade81e1 100644 (file)
@@ -286,7 +286,7 @@ delegate_remove_shortcut_folder (GtkFileChooser  *chooser,
 static GSList *
 delegate_list_shortcut_folders (GtkFileChooser *chooser)
 {
-  return gtk_file_chooser_list_shortcut_folders (get_delegate (chooser));
+  return _gtk_file_chooser_list_shortcut_folder_files (get_delegate (chooser));
 }
 
 static gboolean